#include "tetromino.hpp"
#include "constants.hpp"
#include <stdexcept> // For std::runtime_error

namespace Tetris {

// 静态成员初始化
const std::map<BlockType, Tetromino>& Tetromino::getAllTetrominos() {
    static std::map<BlockType, Tetromino> tetrominos;
    if(tetrominos.empty()) {
        // I Block (Cyan)
        tetrominos.emplace(BlockType::I, Tetromino(
            BlockType::I, COLOR_PAIR_I_BLOCK,
            {
                {{0,1}, {1,1}, {2,1}, {3,1}},  // 水平 -
                {{1,0}, {1,1}, {1,2}, {1,3}},  // 垂直 |
                {{0,1}, {1,1}, {2,1}, {3,1}},  // 重复状态0
                {{1,0}, {1,1}, {1,2}, {1,3}}   // 重复状态1
            }
        ));
        // O Block (Yellow)
        tetrominos.emplace(BlockType::O, Tetromino(
            BlockType::O, COLOR_PAIR_O_BLOCK,
            {
                {{0,0}, {1,0}, {0,1}, {1,1}},  // 唯一状态
                {{0,0}, {1,0}, {0,1}, {1,1}},  // 重复
                {{0,0}, {1,0}, {0,1}, {1,1}},  // 重复
                {{0,0}, {1,0}, {0,1}, {1,1}}   // 重复  
            }                            
        ));
        // T Block (Magenta)
        tetrominos.emplace(BlockType::T, Tetromino(
            BlockType::T, COLOR_PAIR_T_BLOCK,
            {
                {{1,0}, {0,1}, {1,1}, {2,1}},  // T朝上
                {{0,0}, {0,1}, {0,2}, {1,1}},  // T朝右
                {{0,1}, {1,1}, {2,1}, {1,2}},  // T朝下
                {{1,0}, {1,1}, {1,2}, {0,1}}   // T朝左 
            }
        ));
        // S Block (Green)
        tetrominos.emplace(BlockType::S, Tetromino(
            BlockType::S, COLOR_PAIR_S_BLOCK,
            {
                {{1,0}, {2,0}, {0,1}, {1,1}},  // 水平
                {{0,0}, {0,1}, {1,1}, {1,2}},  // 垂直
                {{1,0}, {2,0}, {0,1}, {1,1}},  // 重复状态0
                {{0,0}, {0,1}, {1,1}, {1,2}}   // 重复状态1
            }
        ));
        // Z Block (Red)
        tetrominos.emplace(BlockType::Z, Tetromino(
            BlockType::Z, COLOR_PAIR_Z_BLOCK,
            {
                {{0,0}, {1,0}, {1,1}, {2,1}},  // 水平
                {{1,0}, {0,1}, {1,1}, {0,2}},  // 垂直
                {{0,0}, {1,0}, {1,1}, {2,1}},  // 重复状态0
                {{1,0}, {0,1}, {1,1}, {0,2}}   // 重复状态1
            }
        ));
        // J Block (Blue)
        tetrominos.emplace(BlockType::J, Tetromino(
            BlockType::J, COLOR_PAIR_J_BLOCK,
            {
        {{0,0}, {0,1}, {0,2}, {1,2}},  // 状态0：J朝上
        {{0,1}, {1,1}, {2,1}, {2,0}},  // 状态1：J朝右
        {{1,0}, {1,1}, {1,2}, {0,0}},  // 状态2：J朝下
        {{0,0}, {1,0}, {2,0}, {0,1}}   // 状态3：J朝左
            }
        ));
        // L Block (White)
        tetrominos.emplace(BlockType::L, Tetromino(
            BlockType::L, COLOR_PAIR_L_BLOCK,
            {
        {{0,2}, {1,0}, {1,1}, {1,2}},  // 状态0：L朝上
        {{0,0}, {0,1}, {1,1}, {2,1}},  // 状态1：L朝右
        {{0,0}, {0,1}, {0,2}, {1,0}},  // 状态2：L朝下
        {{0,1}, {1,1}, {2,1}, {2,2}}   // 状态3：L朝左
            }
        ));        
    }
    return tetrominos;
}

} // namespace Tetris

